

#ifndef __IO_H__
#define __IO_H__

#include "BSP_IO.h"

typedef struct IO_Tag IO_T;

struct IO_Tag{
	void* port;
	uint16_t pin;
};

typedef struct AFIO_Tag AFIO_T;

struct AFIO_Tag {
	IO_T io;
	uint8_t af;
};

#define IO_INIT_TABLE(port, pin)	{(void*)port, pin}
#define AFIO_INIT(port, pin, af)	{IO_INIT_TABLE(port, pin), af}

typedef enum {
	IO_Mode_OUT = 0, 	//output
	IO_Mode_OD = 1,		//open drain
	IO_Mode_IN = 2,		//input
	IO_Mode_AIN = 3,
	IO_Mode_IPD = 4,
	IO_Mode_IPU = 5,
	IO_Mode_AFOD = 6,
	IO_Mode_AFPP = 7,
}IO_Mode;

void IO_Init(const IO_T* io, uint32_t mode);
void IO_Config(const IO_T* io, uint32_t mode);
void IO_Set(const IO_T* io, int state);
int IO_Get(const IO_T* io);
void IO_ExtInit(const IO_T* io, int config, void* param);
//读取一组IO的状态
uint32_t IO_MultGet(const IO_T* io, uint8_t num);
//设置一组IO的状态
void IO_MultSet(const IO_T* io, uint8_t num, uint32_t stateMap);

void IO_AF_Set(const IO_T* io, uint32_t af);

void IO_Active(const IO_T* io);

void AFIO_Init(const AFIO_T* afio);


#endif



